package ar.edu.unlu.sistemas.p2p.business.msg;

import org.jdom.Document;
import org.jdom.Element;

import ar.edu.unlu.sistemas.p2p.business.util.XMLManager;

public abstract class Message {
	
	public static final String TAG_ROOT = "msg";
	private Header header;
	
	
	public Message(Document xmlDoc) {
		this.buildFromXMLDoc(xmlDoc);
	}
	
	public Message(String msgId,int type) {
		this.setHeader(new Header(msgId,type));
	}
	
	public Message(int type) {
		this.setHeader(new Header(type));
	}
	
	public Header getHeader() {
		return header;
	}

	public void setHeader(Header header) {
		this.header = header;
	}

	/**
	 * A partir del objeto documento, que representa uno del formato xml, voy seteando los valores de
	 * todos los atributos correspondientes al mensaje.
	 * 
	 * @param xmlDoc
	 * @return xmlElement
	 */
	protected Element buildFromXMLDoc(Document xmlDoc) {
		Element root = xmlDoc.getRootElement();
		this.setHeader(Header.buildFromXMLElement(root.getChild(Header.TAG_ROOT)));
		return root;
	}
	
	/**
	 * Va armando el elemento raíz del xml, agregando los valores de los atributos en sus tags
	 * correspondientes que luego se va a contener dentro de un documento de este formato. 
	 * 
	 * @return xmlElement
	 */
	public Element toXMLElement() {
		Element el = new Element(TAG_ROOT);
		el.addContent(this.getHeader().toXMLElement());
		return el;
	}
	
	/**
	 * Simplemente ejecuta el método que retorna el elemento raíz de xml y lo agrega a un
	 * documento que instancia. Luego, éste último, es el que imprimirá el xml. 
	 * 
	 * @return xmlDocument
	 */
	public Document toXMLDocument() {
		Document doc = new Document();
		return doc.setContent(this.toXMLElement());
	}
	
	/**
	 * Imprime el xml en sí, a partir de la creación de un documento formado por los
	 * atributos respectivos del mensaje.
	 * 
	 * @return xml
	 */
	public String toXMLString() {
		return XMLManager.getInstance().xmlDocToString(this.toXMLDocument());
	}
	
}
